import Vue from "vue";
// 导入路由插件
import VueRouter from 'vue-router'
// 使用路由插件
Vue.use(VueRouter)
// 引入vuex中的store仓库
import store from '@/store'
// 引入routes路由配置信息
import routes from "./routes";
// 引入封装的cookies函数
import { setCookie, getCookie, delCookie } from '@/utils/cookie'

// 保存VueRouter原型对象的push方法
const originPush = VueRouter.prototype.push
// 保存VueRouter原型对象的replace方法
const originReplace = VueRouter.prototype.replace

// 重写push/replace方法
// location:要跳转的路由配置对象，resolve/reject：成功/失败的对调函数
VueRouter.prototype.push = function (location, resolve, reject) {
  // 如果调用push的时候传入成功/失败的处理函数，那就调用原来的push方法
  if (resolve && reject) {
    originPush.call(this, location, resolve, reject)
  } else {
    // 如果调用push的时候没传入成功/失败处理函数，那就传入空的回调
    originPush.call(this, location, () => { }, () => { })
  }
}

VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {
    originReplace.call(this, location, resolve, reject)
  } else {
    originReplace(this, location, () => { }, () => { })
  }
}


// 创建路由器并向外暴露
let router = new VueRouter({
  // 配置路由信息(为了简化index.js代码量，因此单独把routes分隔出一个模块)
  routes,
  // 滚动行为
  scrollBehavior (to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { x: 0, y: 0 }
    }
  }
})

// 全局前置路由守卫
// to：要跳转到的组件路由信息
// from：当前组件路由信息
// next: 放行函数,next()或next('/login')(放行到指定路由)
// next（false）：中断当前导航，如果浏览器URL地址改变，那么URL地址会重置到from对应地址
router.beforeEach(async (to, from, next) => {
  // 查看cookie中有无token，有说明登陆，没有说明没登陆
  // token
  let token = getCookie('token');
  // 用户名
  let name = store.state.user.userLoginData.name
  // 1.用户是否登陆
  if (token) {
    // 1.1用户登录了，不允许跳转到login
    if (to.path == '/login') {
      // console.log(token);
      next('/home');
    } else {
      // 1.2登陆了但去的不是login
      // 如果用户名存在，可以直接放行
      if (name) {
        next();
      } else {
        // 如果没有用户信息，派发action让仓库存储用户信息
        // 获取用户登陆信息
        try {
          await store.dispatch('getUserInfo');
          next();
        } catch (error) {
          // token过期失效,应该清除掉过期token
          delCookie('token');
          // 重新跳转到登录页
          next('/login')
        }
      }
    }
  } else {
    // 2.没登陆，不能使用购物车，个人中心，交易相关的页面
    let toPath = to.path;
    // console.log(toPath.indexOf('/addCartSuccess'));
    if (toPath.indexOf('/addCartSuccess') != -1 || toPath.indexOf('/shopcart') != -1 || toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
      alert('无访问权限，请先登陆!');
      next(`/login?redirect=${toPath}`);
    } else {
      next();
    }
  }
})

export default router;
